#include <head.h>
int main(int argc, char *argv[])
{
    if (2 != argc)
    {
        printf("格式错误 : %s file\n", argv[0]);
        return 0;
    }
    struct stat st;
    stat (argv[1], &st);
    printf("设备号 : %ld\n", st.st_dev);
    printf("inode : %ld\n", st.st_ino);
    printf("硬链接数 : %ld\n", st.st_nlink);
    printf("用户ID : %d\n", st.st_uid);
    printf("组ID : %d\n", st.st_gid);
    printf("文件大小 : %ld\n", st.st_size);
    printf("块大小 : %ld\n", st.st_blksize);
    printf("块数 : %ld\n", st.st_blocks);
    printf("访问时间 : %s\n", ctime(&st.st_atime));
    printf("修改时间 : %s\n", ctime(&st.st_mtime));
    printf("状态改变时间 : %s\n", ctime(&st.st_ctime));

//文件类型
 // 文件类型   ls
    switch (st.st_mode & S_IFMT)
    {
        case S_IFREG:
            printf("-");
            break;
        case S_IFDIR:
            printf("d");
            break;
        case S_IFCHR:
            printf("c");
            break;
        case S_IFBLK:
            printf("b");
            break;
    default:
        break;
    }

    // 文件权限
    printf((st.st_mode & S_IRUSR) ? "r" : "-");  //  用户权限
    printf((st.st_mode & S_IWUSR) ? "w" : "-");  //  用户权限
    printf((st.st_mode & S_IXUSR) ? "x" : "-");  //  用户权限
    printf((st.st_mode & S_IRGRP) ? "r" : "-");  //  用于组
    printf((st.st_mode & S_IWGRP) ? "w" : "-");  //  用于组
    printf((st.st_mode & S_IXGRP) ? "x" : "-");  //  用于组
    printf((st.st_mode & S_IROTH) ? "r" : "-");  //  其他用户
    printf((st.st_mode & S_IWOTH) ? "w" : "-");  //  其他用户
    printf((st.st_mode & S_IXOTH) ? "x" : "-");  //  其他用户

    return 0;
}

// struct stat {
//     dev_t     st_dev;     /* 文件所在的设备 ID */
//     ino_t     st_ino;     /* 文件的 inode 编号 文件的唯一编号 使用ls -i 可以查看 */
//     mode_t    st_mode;    /* 文件的类型和权限 */
//     nlink_t   st_nlink;   /* 硬链接的数量 */
//     uid_t     st_uid;     /* 文件所有者的用户 ID */
//     gid_t     st_gid;     /* 文件所有者的组 ID */
//     dev_t     st_rdev;    /* 设备类型（如果这是设备文件） */
//     off_t     st_size;    /* 文件大小，以字节为单位 */
//     blksize_t st_blksize; /* 文件系统 I/O 的块大小 */
//     blkcnt_t  st_blocks;  /* 为这个文件分配的块数 */
//     time_t    st_atime;   /* 上次访问时间 */
//     time_t    st_mtime;   /* 上次修改时间 */
//     time_t    st_ctime;   /* 上次状态改变时间 */
// };